package org.itstack.state;

/**
 * 状态模式演示类
 * 展示状态模式的基本用法和状态转换
 * 
 * 状态模式核心思想：
 * 1. 将状态封装成独立的类
 * 2. 状态转换由状态类内部控制
 * 3. 上下文类委托操作给当前状态
 * 
 * 适用场景：
 * - 对象的行为依赖于它的状态
 * - 状态转换逻辑复杂
 * - 需要避免大量的条件判断
 */
public class StatePatternDemo {
    
    /**
     * 演示状态模式的基本用法
     */
    public static void demonstrateStatePattern() {
        System.out.println("=== 状态模式演示 ===");
        
        // 创建上下文，初始状态为状态A
        Context context = new Context("DEMO-001", new ConcreteStateA());
        
        System.out.println("初始状态：" + context.getCurrentState());
        
        // 演示状态转换
        System.out.println("\n--- 执行action1 ---");
        context.handleAction("action1");
        System.out.println("当前状态：" + context.getCurrentState());
        
        System.out.println("\n--- 执行action2 ---");
        context.handleAction("action2");
        System.out.println("当前状态：" + context.getCurrentState());
        
        System.out.println("\n--- 执行action3 ---");
        context.handleAction("action3");
        System.out.println("当前状态：" + context.getCurrentState());
        
        System.out.println("\n--- 执行action1 ---");
        context.handleAction("action1");
        System.out.println("当前状态：" + context.getCurrentState());
        
        // 演示无效动作
        System.out.println("\n--- 执行无效动作invalid ---");
        context.handleAction("invalid");
        System.out.println("当前状态：" + context.getCurrentState());
    }
    
    /**
     * 演示状态模式的循环转换
     */
    public static void demonstrateStateCycle() {
        System.out.println("\n=== 状态循环演示 ===");
        
        Context context = new Context("CYCLE-001", new ConcreteStateA());
        
        // 执行一个完整的状态循环：A -> B -> C -> A
        String[] actions = {"action1", "action3", "action1"};
        
        for (String action : actions) {
            System.out.println("\n--- 执行" + action + " ---");
            context.handleAction(action);
            System.out.println("当前状态：" + context.getCurrentState());
        }
    }
    
    /**
     * 演示多上下文实例
     */
    public static void demonstrateMultipleContexts() {
        System.out.println("\n=== 多上下文实例演示 ===");
        
        // 创建多个上下文实例
        Context context1 = new Context("CTX-001", new ConcreteStateA());
        Context context2 = new Context("CTX-002", new ConcreteStateB());
        Context context3 = new Context("CTX-003", new ConcreteStateC());
        
        System.out.println("上下文1状态：" + context1.getCurrentState());
        System.out.println("上下文2状态：" + context2.getCurrentState());
        System.out.println("上下文3状态：" + context3.getCurrentState());
        
        // 对不同的上下文执行相同的动作
        System.out.println("\n--- 所有上下文执行action1 ---");
        context1.handleAction("action1");
        context2.handleAction("action1");
        context3.handleAction("action1");
        
        System.out.println("上下文1状态：" + context1.getCurrentState());
        System.out.println("上下文2状态：" + context2.getCurrentState());
        System.out.println("上下文3状态：" + context3.getCurrentState());
    }
}
